Skip to main content

Concurrency

   public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

// TASK IS FROZEN
private void executeSync_Click(object sender, RoutedEventArgs e)
{
var watch = System.Diagnostics.Stopwatch.StartNew();

RunDownloadSync();

watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

resultsWindow.Text += $"Total execution time: { elapsedMs }";
}

private async void executeAsync_Click(object sender, RoutedEventArgs e)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
// Without await it would first print out time then all the sites
await RunDownloadParallelAsync();

watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

resultsWindow.Text += $"Total execution time: { elapsedMs }";
}

private List<string> PrepData()
{
List<string> output = new List<string>();

resultsWindow.Text = "";

output.Add("https://www.yahoo.com");
output.Add("https://www.google.com");
output.Add("https://www.microsoft.com");
output.Add("https://www.cnn.com");
output.Add("https://www.codeproject.com");
output.Add("https://www.stackoverflow.com");

return output;
}

private async Task RunDownloadAsync()
{
List<string> websites = PrepData();

foreach (string site in websites)
{
WebsiteDataModel results = await Task.Run(() => DownloadWebsite(site));
ReportWebsiteInfo(results);
}
}

private async Task RunDownloadParallelAsync()
{
List<string> websites = PrepData();
List<Task<WebsiteDataModel>> tasks = new List<Task<WebsiteDataModel>>();

foreach (string site in websites)
{

// tasks.Add(DownloadWebsiteAsync(site));
tasks.Add(Task.Run(()=>DownloadWebsite(site)))
}

var results = await Task.WhenAll(tasks);

foreach (var item in results)
{
ReportWebsiteInfo(item);
}
}

private void RunDownloadSync()
{
List<string> websites = PrepData();

foreach (string site in websites)
{
WebsiteDataModel results = DownloadWebsite(site);
ReportWebsiteInfo(results);
}
}

private WebsiteDataModel DownloadWebsite(string websiteURL)
{
WebsiteDataModel output = new WebsiteDataModel();
WebClient client = new WebClient();

output.WebsiteUrl = websiteURL;
output.WebsiteData = client.DownloadString(websiteURL);

return output;
}

private async Task<WebsiteDataModel> DownloadWebsiteAsync(string websiteURL)
{
WebsiteDataModel output = new WebsiteDataModel();
WebClient client = new WebClient();

output.WebsiteUrl = websiteURL;
output.WebsiteData = await client.DownloadStringTaskAsync(websiteURL);

return output;
}

private void ReportWebsiteInfo(WebsiteDataModel data)
{
resultsWindow.Text += $"{ data.WebsiteUrl } downloaded: { data.WebsiteData.Length } characters long.{ Environment.NewLine }";
}
}
asyncTask<int> Delay1() { awaitTask.Delay(1000); return1; }
asyncTask<int> Delay2() { awaitTask.Delay(2000); return2; }
asyncTask<int> Delay3() { awaitTask.Delay(3000); return3; }

vart1 = Delay1();
vart2 = Delay2();
vart3 = Delay3();

// Include handling of results ↓↓↓ this takes 3s in total ↓↓↓
Console.WriteLine("{0} {1} {2}", awaitt1, awaitt2, awaitt3);

// Or, without handling the results:
await Task.WhenAll(t1, t2, t3);
Console.WriteLine("All done!");